iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
自我挑戰組

打掉重練!Django的還債之旅~系列 第 10

Day10. middleware mixin

  • 分享至 

  • xImage
  •  

前言

settings中的middleware真的有人進去看過嗎!?而昨天我們看了request進middleware加工廠,那今天就來看看內部有什麼吧!

正題

當然就是先找一個middleware來看看
https://ithelp.ithome.com.tw/upload/images/20230925/201629054OGICW55s7.png
我們就看看第一個middleware吧~django.middleware.security.SecurityMiddleware
跟著路徑進去,會看到
https://ithelp.ithome.com.tw/upload/images/20230925/2016290501iFGH0jy8.png
其中的MiddlewareMixin就是我們今天的主角啦!!
https://ithelp.ithome.com.tw/upload/images/20230925/20162905p0BHUxZwa5.png
這個就是我們的主角,但還記得昨天的self._middleware_chain是怎麼串的嗎!?回顧一下
middleware_chain會是由一個一個inner function去串連起來的
https://ithelp.ithome.com.tw/upload/images/20230925/20162905cgds48s3kE.png
而其中的adapted_handler就是inner function
https://ithelp.ithome.com.tw/upload/images/20230925/20162905VgWZrC8mlX.png
最後串出來的middleware大概會長得像這樣mid4(mid3(mid2(mid1())))
由此可知,MiddlewareMixininit時給的get_response就是inner function
最後_middleware_chain會在get_response function時被呼叫
https://ithelp.ithome.com.tw/upload/images/20230925/20162905PKGhRbReJP.png
而呼叫時會觸發的是inner中的邏輯
https://ithelp.ithome.com.tw/upload/images/20230925/20162905ha5dVRaxBy.png
而其中的get_response(request)會去觸發MiddlewareMixin中的__call__()
https://ithelp.ithome.com.tw/upload/images/20230925/20162905JjWPgmZ8Li.png
那這邊就會一層一層的往裡面去處理request,這樣講解我自己都覺得有點抽象,我們一樣上圖來看看!
https://ithelp.ithome.com.tw/upload/images/20230925/20162905ne4jv3gVxj.png
照目前資訊畫出來會長這樣,當然MiddleMixin其實不只這些官網範例還有其他項,但我們依照目前資訊畫出來的就如上圖,還有其中最重要處理view的邏輯在最裡面那層,也就是在load_middleware()的時候這個部分
https://ithelp.ithome.com.tw/upload/images/20230925/20162905HQeMJIVYht.png
其中的self._get_response就是我們明天的主角!!

結語

雖然現在已經看懂middleware在做什麼事情了,但我卻不太清楚什麼時機點會去用他(客製化)就是了,比較常看到的是第三方套件大概率會有自己寫的middleware去處理request或response,可能是我做過的專案不夠多不夠複雜吧~不過讀懂了之後遇到感覺可以套用的情境時,就是讓自己多了個選擇!!


上一篇
Day09. request加工廠"middleware"~
下一篇
Day11. 我們常寫的view,在這裡!
系列文
打掉重練!Django的還債之旅~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言